package user

//权限
//认证
import (
	"fmt"
	"gin_blog/model"
	_ "gin_blog/model"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
	"github.com/gin-gonic/gin"
	"net/http"
	"strings"
)

/*
	用户登录
	url:/api/v1/users/login
	method: post
*/
func userPostLogin(ctx *gin.Context) {
	//建立数据库连接
	db := model.GetDB()
	defer db.Close()
	//声明数据库和数据验证对象
	var userLogin UserLoginModel
	var userModel model.UserModel
	var userTokenModel model.UserTokenModel
	//数据绑定 数据验证
	err := ctx.ShouldBind(&userLogin)
	if err != nil {
		ctx.JSON(http.StatusNotFound, map[string]interface{}{
			"code": 4001,
			"msg":  "请求参数错误",
			"data": "",
		})
		return
	}
	db.First(&userLogin, "username=? and password=? ", userLogin.Username, userLogin.Password) //指定根据name去查询
	db.First(&userModel, "username=? and is_delete=?", userLogin.Username, 0) //指定根据name去查询用户的id

	if userModel.ID == 0 {
		ctx.JSON(http.StatusOK, map[string]interface{}{
			"code": 4106,
			"msg":  "该用户不存在",
			"data": "",
		})
		return
	}
	//业务处理 设置token
	userID := int(userModel.ID) //获取用户的id
	tokens := utils.GetUUID()   //生成一个token
	db.Find(&userTokenModel, "user_id=?", userID) //去token表中查询id和userid一样的数据
	if userTokenModel.UserId != 0 { //有结果更新
		db.Model(&model.UserTokenModel{}).Update("token", tokens)
	} else { //没结果新增
		db.Create(&model.UserTokenModel{UserId: userID, Token: tokens})
	}
	//返回应答
	ctx.JSON(http.StatusOK, map[string]interface{}{
		"code": 200,
		"msg":  "用户登录成功",
		"data": map[string]interface{}{
			"user_id": userID,
			"token":   tokens,
		},
	})
}

/*
	用户登录
	url:/api/v1/users/logout
	method: post
*/
func userPostLogout(ctx *gin.Context) {
	//建立数据库连接
	db := model.GetDB()
	defer db.Close()
	//声明数据库和数据验证对象
	var userTokenModel model.UserTokenModel
	//获取参数token
	//token := ctx.Query("token")
	token := ctx.Request.Header.Get("token")
	//for k,v := range  {
	//	fmt.Printf("%s=%s\n", k, v[0])
	//}
	fmt.Println("token",token)
	if token=="" || len(token)<=25 || len(token)>=35{
		ctx.JSON(http.StatusOK, map[string]interface{}{
			"code": 4001,
			"msg":  "请求参数错误",
			"data": "",
		})
		return
	}
	db.Delete(&userTokenModel).Where("token=?", token)
	//返回应答
	ctx.JSON(http.StatusOK, map[string]interface{}{
		"code": 200,
		"msg":  "用户已退出",
		"data": "",
	})
	return
}

/*
	用户注册
	url:/api/v1/users/register
	method: post
*/
func userPostRegister(ctx *gin.Context) {
	//建立数据库连接
	db := model.GetDB()
	defer db.Close()
	//声明数据库和数据验证对象
	var user UserRegisterModel
	var userModel model.UserModel
	//数据验证
	err := ctx.ShouldBind(&user)
	if err != nil {
		ctx.JSON(http.StatusNotFound, map[string]interface{}{
			"code": 4001,
			"msg":  "请求参数错误",
			"data": "",
		})
		return
	}
	if find := strings.Contains(user.Email, "@"); !find {
		ctx.JSON(http.StatusOK, map[string]interface{}{
			"code": 4001,
			"msg":  "请求参数错误",
			"data": "",
		})
		return
	}
	//判断用户是否已经注册
	db.First(&userModel, "username=? and is_delete=?", user.Username, 0) //指定根据name去查询用户的id )
	if userModel.Username != ""{
		ctx.JSON(http.StatusOK, map[string]interface{}{
			"code": 4101,
			"msg":  "用户已注册",
			"data": "",
		})
		return
	}
	//业务处理
	db.Create(&model.UserModel{Username: user.Username, Phone: user.Phone, Email: user.Email, Password: user.Password, IsDelete: 0}) //4.返回应答
	registerData := map[string]interface{}{
		"username": user.Username,
	}
	//返回应答
	ctx.JSON(http.StatusOK, map[string]interface{}{
		"code": 200,
		"msg":  "用户注册成功",
		"data": registerData,
	})
	return
}

/*
	获取用户列表admin
	url: /api/v1/users
	method: get
*/
func userGet(ctx *gin.Context) {
	// 获取数据库连接
	db := model.GetDB()
	defer db.Close()
	// 获取数据表的model
	var users []model.UserModel
	// 获取token
	token := ctx.Request.Header.Get("token")
	fmt.Println(token)
	// 去数据库查询token对应的用户信息
	db.First(&users).Where("token=?", token)
	// 返回应答
	ctx.JSON(http.StatusOK, map[string]interface{}{
		"code": 200,
		"msg":  "ok",
		"data": users,
	})
}

/*
	获取用户列表admin
	url: /api/v1/users
	method: get
*/
func usersGet(ctx *gin.Context) {
	// 获取数据库连接
	db := model.GetDB()
	defer db.Close()
	// 获取数据表的model
	var users []model.UserModel
	// 业务处理
	db.Find(&users)
	// 返回应答
	ctx.JSON(http.StatusOK, map[string]interface{}{
		"code": 200,
		"msg":  "ok",
		"data": users,
	})
}

/*
	更新用户列表
	url: /api/v1/users/:userID
	method: put
*/
func userPut(ctx *gin.Context) {
	//获取数据库连接
	db := model.GetDB()
	defer db.Close()

	//数据绑定
	var user UserModelPut
	var userModel model.UserModel
	err := ctx.ShouldBind(&user)
	if err != nil {
		ctx.JSON(http.StatusNotFound, map[string]interface{}{
			"code": 4001,
			"msg":  "数据绑定失败",
			"data": "",
		})
		return
	}

	//获取url 参数 userid
	userID := ctx.Param("user_id")

	//更新数据库
	userInfo := map[string]interface{}{
		"email":    user.Email,
		"phone":    user.Phone,
	}
	db.Model(&userModel).Where("id=?", userID).Update(userInfo)

	//返回应答
	ctx.JSON(http.StatusOK, map[string]interface{}{
		"code": 200,
		"msg":  "ok",
		"data": userInfo,
	})
	return
}

/*
	删除用户列表
	url: /api/v1/users/:userID
	method: delete
*/
func userDelete(ctx *gin.Context) {
	//获取数据库连接
	db := model.GetDB()
	defer db.Close()

	//获取model
	var userModel model.UserModel
	var userTokenModel model.UserTokenModel

	//获取url 参数 userid
	userID := ctx.Param("user_id")

	//业务处理
	//软删除
	db.Model(&userModel).Where("id=?", userID).Delete(&userModel)

	//有问题（）
	db.First(&userModel).Where("id=?", userID).Update("is_delete",1)

	//清除token
	db.Model(&userTokenModel).Where("user_id=?", userID).Delete(&userTokenModel)

	//返回应答
	ctx.JSON(http.StatusOK, map[string]interface{}{
		"code": 200,
		"msg":  "ok",
		"data": "",
	})
}
